home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / spiele / thrust / source / image.mod next >
Text File  |  1996-07-03  |  3KB  |  118 lines

  1. MODULE Image;
  2.  
  3. IMPORT File, VR := VDIRaster, SYSTEM;
  4.  
  5. TYPE
  6.   HeaderType = RECORD
  7.     Version,
  8.     Length,
  9.     Planes,
  10.     PatternLength,
  11.     PixelWidth,
  12.     PixelHeight,
  13.     LineWidth,
  14.     Lines : INTEGER; (* 2 Bytes Typ! *)
  15.     XIMGID : ARRAY 4 OF CHAR;
  16.     ColorModel : INTEGER;
  17.   END;
  18.   PtrHeaderType = POINTER TO HeaderType;
  19.  
  20.   RGBListType = RECORD
  21.     red, green, blue : INTEGER;
  22.   END;
  23.  
  24.   FilePtr = POINTER TO ARRAY MAX(LONGINT) OF CHAR;
  25.  
  26.  
  27. PROCEDURE Decompress (img : PtrHeaderType; dest : FilePtr);
  28. VAR repetitions, count, k, l, p, z, LineBytes, LineBytes2 : INTEGER;
  29.     source : FilePtr;
  30.     i, j, off, PlaneBytes : LONGINT;
  31. BEGIN
  32.   source := SYSTEM.VAL(LONGINT,img) + 2 * img^.Length;
  33.   LineBytes := (img^.LineWidth + 7) DIV 8;
  34.   LineBytes2 := (img^.LineWidth + 15) DIV 16 * 2;
  35.   PlaneBytes := LONG(LineBytes2) * LONG(img^.Lines);
  36.   i := 0; z := 0;
  37.  
  38.   REPEAT (* Für jede Zeile *)
  39.  
  40.     repetitions := 1;
  41.     IF (source^[i] = CHR(0)) AND (source^[i+1] = CHR(0)) AND
  42.        (source^[i+2] = CHR(255)) THEN
  43.       repetitions := ORD(source^[i+3]);
  44.       INC(i, 4);
  45.     END;
  46.  
  47.     FOR p := 0 TO img^.Planes-1 DO (* Für jede Farbebene *)
  48.       off := LONG(p) * PlaneBytes + LONG(z) * LONG(LineBytes2);
  49.       j := 0;
  50.       REPEAT
  51.         IF source^[i] = CHR(0) THEN (* Pattern Run *)
  52.           INC(i); count := ORD(source^[i]);
  53.           ASSERT(count = 0, 100);
  54.           FOR k := 1 TO count DO
  55.             FOR l := 1 TO img^.PatternLength DO
  56.               dest^[j+off] := source^[i+LONG(l)]; INC(j);
  57.             END;
  58.           END;
  59.           INC(i, img^.PatternLength + 1);
  60.         ELSIF source^[i] = CHR(128) THEN (* Bitstring *)
  61.           INC(i); count := ORD(source^[i]); INC(i);
  62.           FOR k := 1 TO count DO
  63.             dest^[j+off] := source^[i]; INC(j); INC(i);
  64.           END;
  65.         ELSIF source^[i] < CHR(128) THEN (* Solid Run mit 0 *)
  66.           count := ORD(source^[i]) MOD 128; INC(i);
  67.           FOR k := 1 TO count DO
  68.             dest^[j+off] := CHR(0); INC(j);
  69.           END;
  70.         ELSE (* Solid Run mit 1 *)
  71.           count := ORD(source^[i]) MOD 128; INC(i);
  72.           FOR k := 1 TO count DO
  73.             dest^[j+off] := CHR(255); INC(j);
  74.           END;
  75.         END;
  76.       UNTIL j >= LONG(LineBytes);
  77.       ASSERT(j = LONG(LineBytes), 101);
  78.     END; (* FOR p ... *)
  79.  
  80.     INC(z);
  81.  
  82.     WHILE repetitions > 1 DO
  83.       DEC(repetitions);
  84.       FOR p := 0 TO img^.Planes-1 DO
  85.         off := LONG(p) * PlaneBytes + LONG(z) * LONG(LineBytes2);
  86.         FOR k := 0 TO LineBytes2-1 DO
  87.           dest^[off+LONG(k)] := dest^[off+LONG(k)-LONG(LineBytes2)];
  88.         END;
  89.       END;
  90.       INC(z);
  91.     END;
  92.  
  93.   UNTIL z >= img^.Lines;
  94.   ASSERT(z = img^.Lines, 102);
  95. END Decompress;
  96.  
  97.  
  98. PROCEDURE Load* (Filename : ARRAY OF CHAR; VAR raster : VR.mfdbrec);
  99. VAR img : PtrHeaderType;
  100.     PicSize, FileLength : LONGINT;
  101.     Start : POINTER TO ARRAY OF CHAR;
  102. BEGIN
  103.   IF File.Load(Filename, 0, 0, img, FileLength) THEN
  104.     PicSize := LONG((img^.LineWidth + 15) DIV 16 * 2) * 
  105.                LONG(img^.Lines) * LONG(img^.Planes);
  106.     SYSTEM.NEW(Start, PicSize); raster.Addr := SYSTEM.VAL(LONGINT, Start);
  107.     raster.Width := img^.LineWidth;
  108.     raster.Height := img^.Lines;
  109.     raster.WidthW := (raster.Width + 15) DIV 16;
  110.     raster.Format := 0;
  111.     raster.Planes := img^.Planes;
  112.  
  113.     Decompress (img, raster.Addr);
  114.   END;
  115. END Load;
  116.  
  117.  
  118. END Image.